package mSecretaria;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLBoundOperation.ANONYMOUS;

import myUtils.Constantes;
import myUtils.DBUtils;
import myUtils.EstadoComunidade;
import myUtils.EstadoLivro;
import myUtils.IModelo;
import play.db.DB;
import play.db.jpa.Model;

public class MComunidade extends Model implements IModelo {
	
	//atributos 
	private int codComunidade;
	private int codBairro;
	private String nome;
	private String bairro;
	private EstadoComunidade estado;
	
	//métodos de acesso
	public int getCodBairro() {
		return codBairro;
	}

	public void setCodBairro(int codBairro) {
		this.codBairro = codBairro;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public EstadoComunidade getEstado() {
		return estado;
	}

	public void setEstado(EstadoComunidade estado) {
		this.estado = estado;
	}

	public int getCodComunidade() {
		return codComunidade;
	}

	public String getBairro() {
		return bairro;
	}
	
	//construtores
	
	public MComunidade(int aCodComunidade) throws Exception
	{
		ResultSet rs;
		
		String strQuery = "Select Comunidade.*,Bairro.Nome as Bairro From Comunidade,Bairro Where Comunidade.CodBairro = Bairro.CodBairro and Comunidade.CodComunidade = " + aCodComunidade;
				
		
		try
		{
			rs = DB.executeQuery(strQuery);
			
			
			if(rs == null)
				throw new Exception("Comunidade não cadastrada!");
			
			while (rs.next())
			{
				this.codBairro 		= rs.getInt("CodBairro");
				this.codComunidade 	= rs.getInt("CodComunidade");
				this.bairro			= rs.getString("Bairro");
				this.nome			= rs.getString("Nome");
				
				switch(rs.getInt("Estado"))
				{
					case Constantes.cmAtiva : this.estado = EstadoComunidade.Ativo; break;
					case Constantes.cmInativa : this.estado = EstadoComunidade.Inativo; break;
					case Constantes.cmDesmembrada : this.estado = EstadoComunidade.Desmembrado; break;
				}
			}
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage());
		}
				
	}
	

	public MComunidade (String aNome,int aCodBairro) throws Exception
	{
		ResultSet rs;
		String strQuery = "Select Bairro.Nome as Bairro from Bairro where  Bairro.CodBairro = " + aCodBairro; 
		
		try
		{	
			rs = DB.executeQuery(strQuery);
			while(rs.next())
			{
				this.bairro		= rs.getString("Bairro");
			}
			
			this.codComunidade		= 0;
			this.codBairro			= aCodBairro;
			this.nome				= aNome;
			this.estado				= EstadoComunidade.Ativo;
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage());
		}
	}
	
	private MComunidade(int aCodComunidade,int aCodBairro,String aNome,int aEstado,String aBairro)
	{
		this.codBairro 		= aCodBairro;
		this.codComunidade	= aCodComunidade;
		this.nome			= aNome;
		this.bairro			= aBairro;
		
		switch(aEstado)
		{
			case Constantes.cmAtiva : this.estado = EstadoComunidade.Ativo; break;
			case Constantes.cmInativa : this.estado = EstadoComunidade.Inativo; break;
			case Constantes.cmDesmembrada : this.estado = EstadoComunidade.Desmembrado; break;
		}
		
	}
	
	
	//Crud
	
	public static List<MComunidade> select(int aCodComunidade, String aNome,int aCodBairro,EstadoComunidade aEstado) throws Exception
	{
		
		ResultSet rs;
		String nome,bairro;
		int codComunidade,codBairro;
		int estado;
		
		List<MComunidade> retorno  = new ArrayList<MComunidade>();
		String strQuery = "select Comunidade.*,Bairro.Nome as Bairro from Comunidade,Bairro where Comunidade.CodBairro = Bairro.CodBairro";

		if(aCodComunidade > 0)
		{
			strQuery += " and Comunidade.CodComunidade = " + aCodComunidade;
		}
		
		if(aCodBairro > 0)
		{
			strQuery += " and Comunidade.CodBairro = " + aCodBairro;
		}

		switch (aEstado)
		{
			case Ativo: strQuery += " and Comunidade.Estado = " + Constantes.cmAtiva; break;
			case Inativo: strQuery += " and Comunidade.Estado = " + Constantes.cmInativa; break;
			case Desmembrado: strQuery += " and Comunidade.Estado = " + Constantes.cmDesmembrada; break;
		}

		strQuery += " and Comunidade.Nome Like '" + aNome + "%'";
		
		
		
		try
		{
			rs = DB.executeQuery(strQuery);	
			
			while (rs.next())
			{
				codComunidade 	= rs.getInt("CodComunidade");
				codBairro		= rs.getInt("CodBairro");
				nome			= rs.getString("Nome");
				bairro			= rs.getString("Bairro");
				estado			= rs.getInt("Estado");
				
								 
				MComunidade comunidade = new MComunidade(codComunidade,codBairro,nome,estado,bairro);
				retorno.add(comunidade);
				
			}	
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}
		
		return retorno;		
		
	}
	
	
	
	@Override
	public void update() throws Exception {
		
		if (this.codComunidade == 0)
		{
			this.insert();
		}
		else
		{		
			ResultSet rs;
			
			String strQuery = "Update Comunidade set ";
			strQuery += " Nome = '" + this.nome + "'";
			strQuery += ", CodBairro = " + this.codBairro;
			
			switch(this.estado)
			{
				case Ativo: strQuery += ", Estado = " + Constantes.cmAtiva; break;
				case Inativo: strQuery += ", Estado = " + Constantes.cmInativa; break;
				case Desmembrado: strQuery += ", Estado = " + Constantes.cmDesmembrada; break;
			}
			
			
			strQuery += " Where Comunidade.CodComunidade = " + this.codComunidade;
			
			//atualiza o Objeto
			String strQuery2 = "Select Comunidade.*,Bairro.Nome as Bairro From Comunidade,Bairro Where Comunidade.CodBairro = Bairro.CodBairro and Comunidade.CodComunidade = " + this.codComunidade;
					
			
			try
			{
				DB.execute(strQuery);
				rs = DB.executeQuery(strQuery2);
				
				while (rs.next())
				{
					this.codBairro 		= rs.getInt("CodBairro");
					this.codComunidade 	= rs.getInt("CodComunidade");
					this.bairro			= rs.getString("Bairro");
					this.nome			= rs.getString("Nome");
					
					switch(rs.getInt("Estado"))
					{
						case Constantes.cmAtiva : this.estado = EstadoComunidade.Ativo; break;
						case Constantes.cmInativa : this.estado = EstadoComunidade.Inativo; break;
						case Constantes.cmDesmembrada : this.estado = EstadoComunidade.Desmembrado; break;
					}
				}			
				
			}
			catch(Exception e)
			{
				throw new Exception(e.getMessage() + "\n Comando1: " + strQuery + "Comando2: " + strQuery2);
			}
			
		}

	}

	@Override
	public void excluir() throws Exception {
		
		if(this.codComunidade != 0)
		{
			String strQuery = "Delete From Comunidade Where Comunidade.CodComunidade = " + this.codComunidade;
			
			try
			{
				DB.execute(strQuery);			
			}
			catch(Exception e)
			{
				throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
			}			

		}
	}

	@Override
	public void insert() throws Exception {
		
		String strQuery = "Insert Into Comunidade(CodBairro,Nome,Estado) Values (";
		strQuery +=  this.codBairro;
		strQuery += ",'" + this.nome + "'";
		
		switch(this.estado)
		{
			case Ativo: strQuery += ", " + Constantes.cmAtiva + ")"; break;
			case Inativo:strQuery += ", " + Constantes.cmInativa + ")"; break;
			case Desmembrado:strQuery += ", " + Constantes.cmDesmembrada + ")"; break;
		}
		
		
		try
		{
			DB.execute(strQuery);			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}

	}

}
